package com.pronosticnews.server.services;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.pronosticnews.client.services.ClassementService;
import com.pronosticnews.server.domain.dao.ParticipationDao;
import com.pronosticnews.server.domain.model.Participation;
import com.pronosticnews.shared.model.ClassementDto;
import com.pronosticnews.shared.model.SaisonDto;

import fr.ysa.persistence.DaoException;
import fr.ysa.persistence.requetes.ConfigRequetes;
import fr.ysa.persistence.requetes.filtres.Filtre;
import fr.ysa.persistence.requetes.filtres.Filtre.TYPE;
import fr.ysa.persistence.requetes.filtres.ValueFiltre;
import fr.ysa.persistence.requetes.filtres.ValueFiltre.OPERATION;
import fr.ysa.services.ServiceException;

@Service("classementService")
public class ClassementServiceImpl implements ClassementService {

	@Autowired
	ParticipationDao participationDao;

	@Override
	public List<ClassementDto> getClassement(SaisonDto saison)
			throws ServiceException {
		ConfigRequetes req = new ConfigRequetes();
		Filtre filtreSaison = new Filtre();
		filtreSaison.setName(Participation.VALUE_NAME.saison.name());
		filtreSaison.setType(TYPE.OBJECT);
		ValueFiltre valueSaison = new ValueFiltre();
		valueSaison.setOperation(OPERATION.EQUAL);
		valueSaison.setValue(saison.getId().toString());
		filtreSaison.addValue(valueSaison);
		req.getFiltres().add(filtreSaison);
		try {
			List<Participation> participations = participationDao.trouver(req);
			Collections.sort(participations, new CompareClassementByPoints());
			List<ClassementDto> classements = new ArrayList<ClassementDto>();
			ClassementDto classement = null;
			int place = 1;
			for (Participation participation : participations) {
				classement = new ClassementDto();
				classement.setButsEncaisses(participation.getButsEncaisses());
				classement.setButsMarques(participation.getButsMarques());
				classement.setClub(participation.getClub().getNom());
				classement.setDifferenceButs(participation.getDifferenceButs());
				classement.setMatchsGagnes(participation.getMatchsGagnes());
				classement.setMatchsNuls(participation.getMatchsNuls());
				classement.setMatchsJoues(participation.getMatchsJoues());
				classement.setMatchsPerdus(participation.getMatchsPerdus());
				classement.setPoints(participation.getPoints());
				classement.setPlace(place);
				classement.setLogo(participation.getClub().getLogo());
				classements.add(classement);
				place++;
			}

			return classements;
		} catch (DaoException e) {
			throw new ServiceException(e.getMessage());
		}
	}
}
